特定のインスタンスプロファイルがアタッチされた EC2 インスタンスを一覧化する
コンバンハ、千葉(幸)です。
EC2 インスタンスには IAM ロールをアタッチできます。(正確には、IAM ロールを管理するインスタンスプロファイルというリソースがありそれを EC2 インスタンスにアタッチできます。以降は、特に気にせず「EC2 インスタンスに IAM ロールをアタッチ」と表現します。)
特定の IAM ロールにアタッチされたポリシーを変更したい場合、その IAM ロールを使用しているリソースへの影響が気になります。EC2 用の IAM ロールである場合、「どのインスタンスにアタッチされているか(どのインスタンスがその IAM ロールを使用しているか)」を確認したくなります。
上記について、AWS マネジメントコンソールと AWS CLI で確認する方法をまとめました。
インスタンスプロファイル ARN を確認する
まずは当該インスタンスプロファイルの ARN を確認しましょう。後続の手順では、インスタンスプロファイル ARN が特定できていることを前提にしています。
IAM ロールの詳細画面から確認するのが一番お手軽です。下記画像の赤枠部が該当します。ここでクリップボードにコピーすることもできます。
↑同じ画面にある IAM ロールの ARN と混同しないよう注意してください。
# IAM ロールの ARN 例 arn:aws:iam::000000000000:role/AmazonSSMRoleForInstancesQuickSetup # インスタンスプロファイルの ARN 例 arn:aws:iam::000000000000:instance-profile/AmazonSSMRoleForInstancesQuickSetup
なお、IAM ロールをマネジメントコンソールから作成した場合、インスタンスプロファイルの名称は IAM ロールの名称と同じになっています。(今回の例ではどちらもAmazonSSMRoleForInstancesQuickSetup
)
AWS CLI や IaC などの手段で IAM ロールを作成する場合、ユーザー側で独自に指定することになるため、同一名称とは限りません。
AWS CLI からインスタンスプロファイルを確認する
AWS CLI でインスタンスプロファイルを確認するには、以下コマンドを使用します。
実行例は以下です。--role-name
の引数にロール名を指定する必要があります。
% aws iam list-instance-profiles-for-role \ --role-name AmazonSSMRoleForInstancesQuickSetup { "InstanceProfiles": [ { "Path": "/", "InstanceProfileName": "AmazonSSMRoleForInstancesQuickSetup", "InstanceProfileId": "AIPAQ3BIIH733QK5IGBHL", "Arn": "arn:aws:iam::000000000000:instance-profile/AmazonSSMRoleForInstancesQuickSetup", "CreateDate": "2020-01-24T02:55:56+00:00", "Roles": [ { "Path": "/", "RoleName": "AmazonSSMRoleForInstancesQuickSetup", "RoleId": "AROAQ3BIIH735AQHQPIOW", "Arn": "arn:aws:iam::000000000000:role/AmazonSSMRoleForInstancesQuickSetup", "CreateDate": "2020-01-24T02:55:54+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } ] } ] }
インスタンスプロファイル ARN だけ取得できればいい、ということであれば以下のようにフィルタリングできます。
% aws iam list-instance-profiles-for-role \ --role-name AmazonSSMRoleForInstancesQuickSetup \ --query 'InstanceProfiles[].Arn' \ --output text arn:aws:iam::000000000000:instance-profile/AmazonSSMRoleForInstancesQuickSetup
マネジメントコンソールからインスタンスプロファイルでフィルタリングする
EC2 コンソールのインスタンス一覧画面で、インスタンスプロファイル ARN を用いたフィルタリングができます。
検索窓を押下後、フィルタリングの条件として「IAM インスタンスプロファイル ARN」を指定します。
オペレーターとして=
を選択します。
=
のあとにあらかじめ確認しておいたインスタンスプロファイル ARN を指定すれば、当該インスタンスプロファイルがアタッチされたインスタンスを一覧表示できます。
AWS CLI で特定のインスタンスプロファイルを持つインスタンスを一覧化する
AWS マネジメントコンソールでの一覧化はテキストなどでの取り回しがしづらい、という場合には AWS CLI を活用しましょう。
以下のコマンドを使用します。
フィルタリングしたいインスタンスプロファイルの ARN をあらかじめ環境変数に指定しておきましょう。
INSTANCE_PROFILE_ARN=arn:aws:iam::000000000000:instance-profile/sample-role
--filters
オプションを用いたフィルタリングを実行するコマンド例は以下です。
aws ec2 describe-instances \ --filters Name=iam-instance-profile.arn,Values=$INSTANCE_PROFILE_ARN \ --query "Reservations[].Instances[].{ ID:InstanceId, ProfileArn:IamInstanceProfile.Arn, Name:Tags[?Key=='Name'].Value|[0] }" \ --output text | column -t
以下のように出力されます。インスタンス ID、インスタンスの Name タグ、インスタンスプロファイル ARN を出力するようにしています。--query
オプションでの指定を修正すれば、適宜カスタマイズできます。
i-0cxxxxxxxxxxxxxxx INSTANCE-NAME-1 arn:aws:iam::000000000000:instance-profile/sample-role i-0axxxxxxxxxxxxxxx INSTANCE-NAME-2 arn:aws:iam::000000000000:instance-profile/sample-role i-04xxxxxxxxxxxxxxx INSTANCE-NAME-3 arn:aws:iam::000000000000:instance-profile/sample-role ...
↑column -t
は列の成形のために使用しています。お好みでどうぞ。
なお、--filters
オプションを使わず--query
だけでフィルタリングもできます。
aws ec2 describe-instances \ --query "Reservations[].Instances[?IamInstanceProfile.Arn=='$INSTANCE_PROFILE_ARN'].{ ID:InstanceId, ProfileArn:IamInstanceProfile.Arn, Name:Tags[?Key=='Name'].Value|[0] }" \ --output text | column -t
今回の用途であればどちらも大差ないのでお好みの方をご利用ください。--filter
はサーバーサイドのフィルタリング、--query
はクライアントサイドのフィルタリングです。
終わりに
特定のインスタンスプロファイルがアタッチされた EC2 インスタンスを一覧化したい、という話でした。
「この IAM ロールにアタッチされた IAM ポリシーを変更した時、どの EC2 インスタンスが影響を受けるだろうか?」ということを確認したいケースがあったので、手順をまとめてみました。
同じようなケースの方の参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。